<?php
/*
 * Plugin Name: Promotion Slider
 * Plugin URI: http://www.orderofbusiness.net/wordpress-plugins/promotion-slider/
 * Description: This plugin creates a special post type called 'Promotions' that it uses to populate the carousel.  Just use the shortcode [promoslider] to display the slider on your site.  Be sure to check the <a href="http://wordpress.org/extend/plugins/promotion-slider/faq/" target="_blank">user guide</a> for more information on what this plugin can really do!
 * Version: 3.3.4
 * Author: Micah Wood
 * Author URI: http://micahwood.me
 * License: GPL3
 * License URI: http://www.gnu.org/licenses/gpl-3.0.html
 *
 * Copyright 2012 by Micah Wood - All rights reserved.
 */

// Check for PHP 5.2+ and return error before getting to code that will throw errors
if ( version_compare( PHP_VERSION, '5.2', '<' ) ) {
	if ( is_admin() && (! defined('DOING_AJAX') || ! DOING_AJAX ) ) {
		require_once ABSPATH.'/wp-admin/includes/plugin.php';
		deactivate_plugins( __FILE__ );
	    wp_die( printf( __('Promotion Slider requires PHP version 5.2 or later. You are currently running version %s.  This plugin has now disabled itself.  Please contact your web host regarding upgrading your PHP verson.', 'promotion-slider'), PHP_VERSION ) );
	} else {
		return;
	}
}

// DEFINE CONSTANTS
define( 'PROMOSLIDER_VER', '3.3.4' );
define( 'PROMOSLIDER_URL', plugin_dir_url( __FILE__ ) );
define( 'PROMOSLIDER_PATH', plugin_dir_path( __FILE__ ) );
define( 'PROMOSLIDER_BASENAME', plugin_basename( __FILE__ ) );
// Used for registering activation and deactivation hooks outside of this file
define( 'PROMOSLIDER_FILE', __FILE__ );

// INCLUDE FILES
require( dirname( __FILE__ ) . '/classes/post_type.php' );
require( dirname( __FILE__ ) . '/classes/register_tax.php' );
require( dirname( __FILE__ ) . '/classes/legacy.php' );
require( dirname( __FILE__ ) . '/classes/array_processing.php' );
require( dirname( __FILE__ ) . '/includes/class-api.php' );
require( dirname( __FILE__ ) . '/includes/class-options.php' );
require( dirname( __FILE__ ) . '/includes/functions.php' );

// BEGIN MAIN CLASS
if( !class_exists('promo_slider') ){

	class promo_slider{

		// Define post type and taxonomy name
		private $post_type = 'ps_promotion',
                $taxonomy = 'promotion-categories',
                $options,
                $options_page;

		function __construct(){
			// Set global plugin defaults
			$this->options = array(
				'version' => PROMOSLIDER_VER,
				'start_on' => 'first',				// VALUES: first, random
				'auto_advance' => 'auto_advance',	// VALUES: auto_advance, no_auto_advance
				'time_delay' => 6,					// VALUES: any integer between 3 and 15
				'display_nav' => 'fancy',			// VALUES: none, default, fancy, links, thumb
				'display_title' => 'none',			// VALUES: none, default, fancy
				'display_excerpt' => 'none',		// VALUES: none, excerpt
				'pause_on_hover' => 'no_pause',		// VALUES: pause, no_pause
				'load_js_in' => 'header',			// VALUES: header, footer
				'default_img_size' => 'full',		// VALUES: thumbnail, medium, large, full
				'show_title' => false,				// DEPRECIATED: replaced by display_title, VALUES: true, false
				'show_excerpt' => false,			// DEPRECIATED: replaced by display_excerpt, VALUES: true, false
				'nav_option' => 'default',			// DEPRECIATED: replaced by display_nav, VALUES: none, default, links, thumb
				'disable_fancy_title' => false,		// DEPRECIATED: replaced by display_title, VALUES: true, false
				'disable_fancy_nav' => false		// DEPRECIATED: replaced by display_nav, VALUES: true, false
			);

			// Create the post type that we will pull from
			new wordpress_custom_post_type( $this->post_type, array(
					'singular' => __( 'Promotion', 'promotion-slider' ),
					'plural' => __( 'Promotions', 'promotion-slider' ),
				    'slug' => 'promotion',
                    'textdomain' => 'promotion-slider',
                    'file' => PROMOSLIDER_FILE,
				    'args' => array(
				    	'supports' => array( 'title', 'editor', 'author', 'excerpt', 'thumbnail' )
				    )
				)
			);

			// Register the taxonomy for our post type
			new wordpress_custom_taxonomy( $this->taxonomy, $this->post_type, array(
					'singular' => __( 'Slider', 'promotion-slider' ),
				    'slug' => 'promotions',
					'args' => array( 'hierarchical' => true )
				)
			);

			// Add support for translations
			load_plugin_textdomain( 'promotion-slider', false, dirname( plugin_basename( __FILE__ ) ) . '/lang/' );

			if ( is_admin() ) {

				// Perform some maintenance activities on activation
				register_activation_hook( __FILE__, array($this, 'activate') );

				// Check if plugin has been updated, if so run activation function
				if( promotion_slider( 'option', 'version' ) != PROMOSLIDER_VER )
					$this->activate();

				// Initiate key components
				add_action( 'admin_init', array( $this, 'admin_init' ) );
				add_action( 'admin_menu', array( $this, 'admin_menu' ) );
				add_action( 'admin_print_styles', array( $this, 'admin_print_styles' ) );

				// Add contextual help
				add_filter( 'contextual_help', array( $this, 'slider_options_help' ), 10, 3 );
			} else {
				add_action( 'init', array( $this, 'init' ) );
			}

			// Ensure support for post thumbnails
			add_action( 'after_setup_theme', array( $this, 'after_setup_theme' ) );

			// Load this plugin last to ensure other plugins don't overwrite theme support
			add_action( 'activated_plugin', array( $this, 'load_last' ) );

			// Add menu items to the WordPress admin bar
			add_action( 'wp_before_admin_bar_render', array( $this, 'wp_admin_bar' ) );

		}

		function wp_admin_bar() {
            /**
             * @var WP_Admin_Bar $wp_admin_bar
             */
            global $wp_admin_bar;
			$wp_admin_bar->add_menu( array(
                'parent' => 'appearance',
                'id' => 'promoslider_settings',
                'title' => __('Promotion Slider Options', 'promotion-slider'),
                'href' => admin_url( 'edit.php?post_type='.$this->post_type.'&page=options' )) );
		}

        /**
         * Load CSS for options page
         */
		function admin_print_styles(){
            $screen = get_current_screen();
            if( 'ps_promotion_page_options' == $screen->id ) {
                wp_enqueue_style('options_page_css', plugins_url('/css/admin.css', __FILE__) );
            }
		}

		function slider_options_help( $contextual_help, $screen_id, $screen ){
			if( $screen_id == 'edit-'.$this->post_type ):
				// Promotions
				$contextual_help = $this->get_contents( dirname(__FILE__).'/includes/help.promotions.php' );
			elseif( $screen_id == $this->post_type ):
				// Add New Promotion
				$contextual_help = $this->get_contents( dirname(__FILE__).'/includes/help.add_new_promotion.php' );
			elseif( $screen_id == 'edit-'.$this->taxonomy ):
				// Categories
				$contextual_help = $this->get_contents( dirname(__FILE__).'/includes/help.categories.php' );
			elseif( $screen_id == $this->options_page ):
				// Slider Options
				$contextual_help = $this->get_contents( dirname(__FILE__).'/includes/help.slider_options.php' );
			endif;
			return $contextual_help;
		}

		function get_contents( $filename ) {
			if( is_file($filename) ) {
				ob_start();
				include $filename;
				return ob_get_clean();
			}
			return false;
		}

		function activate() {
			// Make sure user is using WordPress 3.0+
			$this->requires_wordpress_version();
			// Change post type, if necessary
			ps_legacy::change_legacy_post_type();
			// Ensure all options are up-to-date when upgrading
			$this->option_management();
		}

		function requires_wordpress_version( $ver = 3 ){
			global $wp_version;
			if( $wp_version < $ver )
				die( printf( __( 'Sorry, this plugin requires WordPress version %d or later. You are currently running version %s.', 'promotion-slider' ), $ver, $wp_version ) );
		}

		function after_setup_theme(){
			// Adds support for featured images, which is where the slider gets its images
			add_theme_support( 'post-thumbnails' );
		}

		function init(){
			// Load our js and css files
			add_action( 'wp_print_styles', array( $this, 'enqueue_styles' ) );
			add_action( 'wp_print_scripts', array( $this, 'enqueue_scripts' ) );
			// Create [promoslider] shortcode
			add_shortcode( 'promoslider', array( $this, 'show_slider' ) );
			// Enable use of the shortcode in text widgets
			add_filter( 'widget_text', 'do_shortcode' );
		}

		function enqueue_styles(){
			// Loads our styles, only on the front end of the site
			wp_enqueue_style( 'promoslider_main', plugins_url( '/css/slider.css', __FILE__ ) );
		}

		function enqueue_scripts(){
			// Loads our scripts, only on the front end of the site

			// Get plugin options
			$options = $this->get_options();
			// Load javascript
			$load_js_in_footer = ( $options->load_js_in == 'footer' ) ? true : false;
			wp_enqueue_script( 'promoslider_main', plugins_url( '/js/promoslider.js', __FILE__ ), array( 'jquery' ), false, $load_js_in_footer );

			// Localize plugin options
			$data = array('version' => PROMOSLIDER_VER);
			wp_localize_script( 'promoslider_main', 'promoslider_options', $data );
		}

		function admin_init(){
			// Register plugin options
			register_setting( 'promoslider-settings-group', 'promotion_slider_options', array($this, 'update_options') );
			// Add meta boxes to our post type
			add_meta_box( 'promo_slider_meta_box', __('Promotion Slider Options', 'promotion-slider'), array($this, 'meta_box_content'), $this->post_type );
			// Save meta data when saving our post type
			add_action( 'save_post', array($this, 'save_meta_data') );
			// Add our custom column to the promotions listing page
			add_filter( 'manage_edit-ps_promotion_columns', array($this, 'add_promotion_columns') );
			add_action( 'manage_posts_custom_column',  array($this, 'show_promotion_columns') );
			// Add our custom filters to the promotions listing page
			add_action( 'restrict_manage_posts', array($this, 'manage_posts_by_category') );
		}

		function admin_menu(){
			// Create options page
			$this->options_page = add_submenu_page(
				'edit.php?post_type='.$this->post_type,
				__('Promotion Slider Options', 'promotion-slider'),
				__('Slider Options', 'promotion-slider'),
				'manage_options',
				'options',
				array( $this, 'options_page' )
			);
		}

		function load_last(){
			// Get array of active plugins
			if( !$active_plugins = get_option('active_plugins') ) return;
			// Set this plugin as variable
			$my_plugin = 'promotion-slider/'.basename(__FILE__);
			// See if my plugin is in the array
			$key = array_search( $my_plugin, $active_plugins );
			// If my plugin was found
			if( $key !== false ){
				// Remove it from the array
				unset( $active_plugins[$key] );
				// Reset keys in the array
				$active_plugins = array_values( $active_plugins );
				// Add my plugin to the end
				array_push( $active_plugins, $my_plugin );
				// Resave the array of active plugins
				update_option( 'active_plugins', $active_plugins );
			}
		}

		function options_page(){
			// Load options page
			include( dirname(__FILE__).'/includes/options_page.php' );
		}

		function meta_box_content() {
			include( dirname(__FILE__).'/includes/meta_box.php' );
		}

		function save_meta_data( $post_id ) {
			// If this is an auto save, our form has not been submitted, so we don't want to do anything
			if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return $post_id;
			// Is the post type correct?
			if ( isset($_POST['post_type']) && $this->post_type != $_POST['post_type'] ) return $post_id;
			// Verify this came from our screen and with proper authorization, because save_post can be triggered at other times
			if ( !isset($_POST['promo_slider_noncename']) || !wp_verify_nonce( $_POST['promo_slider_noncename'], 'ps_update_promotion' )) { return $post_id; }
			// Can user edit this post?
			if ( !current_user_can('edit_post', $post_id) ) return $post_id;
			// Setup array for the data we are saving
			$data = array('_promo_slider_target', '_promo_slider_url', '_promo_slider_disable_links', '_promo_slider_show_ad_code', '_promo_slider_ad_code', '_promo_slider_cdn_image_url');
			// Use this filter to add postmeta to save for the default post type
			$data = apply_filters('promoslider_add_meta_to_save', $data);
			// Save meta data
			foreach($data as $meta){
				// Get current meta
				$current = get_post_meta($post_id, $meta, true);
				// Get new meta
				$new = isset( $_POST[$meta] ) ? $_POST[$meta] : false;
				// If the new meta is empty, delete the current meta
				if( empty($new) ) delete_post_meta($post_id, $meta);
				// Otherwise, update the current meta
				else update_post_meta($post_id, $meta, $new);
			}
            return $post_id;
		}

		function show_slider( $atts ){
			global $post;
			// Get plugin options
			$options = $this->get_options();
			// Get combined and filtered attribute list
			$options = shortcode_atts( array(
				'id' => false,
				'width' => false,
				'height' => false,
				'post_type' => $this->post_type,
				'category' => false,
				'slider' => false,
				'numberposts' => -1,
				'start_on' => promotion_slider( 'option', 'start_on', 'first' ),
				'auto_advance' => promotion_slider( 'option', 'auto_advance', 'auto_advance' ),
				'time_delay' => promotion_slider( 'option', 'time_delay', 6 ),
				'display_nav' => promotion_slider( 'option', 'display_nav', 'fancy' ),
				'display_title' => promotion_slider( 'option', 'display_title', 'fancy'),
				'display_excerpt' => promotion_slider( 'option', 'display_excerpt', 'none' ),
				'pause_on_hover' => promotion_slider( 'option', 'pause_on_hover', 'no_pause' ),
			), $atts);
			// Validate options
			foreach( $options as $option => $value )
				$options[$option] = $this->validate_options( $option, $value );

			if( $options['slider'] ) {
				$options['category'] = $options['slider'];
			}

			// Extract shortcode attributes
			extract( $options );

			// Create an array with default values that we can use to build our query
			$query = array('numberposts' => $numberposts, 'post_type' => $post_type);

			// If the post type is post or the default, set the category based on taxonomy.
			if( $category ){
				if( $query['post_type'] == $this->post_type ) $query[$this->taxonomy] = $category;
				elseif( $query['post_type'] == 'post' ) $query['category_name'] = $category;
			}

			// Use the promoslider_query filter to customize the results returned.
			$query = apply_filters('promoslider_query', $query);

			// Use the promoslider_query_by_id filter to customize a query for a particular slider.
			$query_by_id = apply_filters('promoslider_query_by_id', array('query' => $query, 'id' => $id));
			$query = $query_by_id['query'];

			if( has_filter('promoslider_custom_query_results') ) {
				// Use the promoslider_custom_query_results to run your own query and return the results object to the slider
				$promo_posts = apply_filters('promoslider_custom_query_results', array() );
			} else {
				// Run query and get posts
				$promo_posts = get_posts( $query );
			}

			// If there are results, build slider.  Otherwise, don't show anything.
			if( $promo_posts ){

				// Initiate iteration counter
				$i = 1;

				// Setup thumbnail array if thumbnail nav is being used
				if( $display_nav == 'thumb' ) $thumb_collection = array();

				// Setup attributes for wrapper element
				$wrapper_classes = 'promo_slider_wrapper '.$start_on;
				if( $display_nav != 'none' ) $wrapper_classes .= ' '.$display_nav.'_nav';
				$wrapper_classes .= ' '.$pause_on_hover;
				$wrapper_atts = ' class="'.$wrapper_classes.'"';

				// Setup attributes for main slider element
				$slider_id = ( $id ) ? ' id="'.$id.'"' : '';
				$slider_classes = 'promo_slider '.$auto_advance;
				$width = ( $width ) ? 'width:'.$width.';' : '';
				$height = ( $height ) ? 'height:'.$height.';' : '';
				$style = ( $width || $height ) ? ' style="'.$width.' '.$height.'"' : '';
				$slider_atts = $slider_id.' class="'.$slider_classes.'"'.$style;

				// Begin Output
				ob_start(); ?>

				<div<?php echo $wrapper_atts; ?>>
					<?php do_action('before_promoslider', $id); ?>

					<div class="promo_slider_nav tabbed_ps_nav slider_selections"></div>

					<div<?php echo $slider_atts; ?>>
						<?php if($time_delay) echo '<span class="promo_slider_time_delay" style="display:none;">'.$time_delay.'</span>'; ?>

						<?php foreach($promo_posts as $post): setup_postdata($post);
							// Setup values to be passed to the promoslider_content action hook //

							// Get the title
							$title = get_the_title();
							// Get the excerpt
							$excerpt = get_the_excerpt();
							// Fetch image for slider
							$image = $this->get_slider_image( $id );
							// Fetch thumbnails for slider nav, if thumbnail nav is being used
							if( $display_nav == 'thumb' ) $thumb_collection[] = $this->get_slider_thumb( $title );
							// Fetch link settings
							extract( $this->fetch_link_settings() );

							// Store all the values in an array and pass it to the promoslider_content action
							$values = compact('id', 'title', 'excerpt', 'image', 'destination_url', 'target', 'disable_links', 'display_title', 'display_excerpt'); ?>

							<div class="panel panel-<?php echo $i; ?>">
								<span class="panel-title" style="display:none;"><?php echo $title; ?></span>
								<?php // Use the promoslider_content action to populate the contents for panel
								do_action('promoslider_content', $values); ?>
							</div>

							<?php $i++; ?>
						<?php endforeach;

						if( $i > 2 && $display_nav != 'thumb' ):
							// Use promoslider_nav action to generate the nav options
							do_action('promoslider_nav', $display_nav);
						endif; ?>

						<div class="clear"></div>

					</div><?php

					if( $i > 2 && $display_nav == 'thumb' )
						do_action('promoslider_thumbnail_nav', array('id' => $id, 'title' => $title, 'thumbs' => $thumb_collection, 'width' => $width) );
					do_action('after_promoslider', $id); ?>

				</div><?php

				// Reset query so that comment forms work properly
				wp_reset_query();

				// End Output
				return ob_get_clean();

			}
		}

		function get_slider_image( $slider_id = false ){
			global $post;
			$options = $this->get_options();
			// If functionality or image doesn't exist, go ahead and terminate
			if( ! function_exists('has_post_thumbnail') || ! has_post_thumbnail($post->ID) )
				return false;
			// Filters allow for use of particular image sizes in the slider
			$image_size = apply_filters('promoslider_image_size', $options->default_img_size);
			// Filters allow for use of particular image sizes in specific sliders
			$image_size = apply_filters('promoslider_image_size_by_id', array('id' => $slider_id, 'image_size' => $image_size) );
			$image_size = $image_size['image_size'];
			// Return the appropriate sized image
			return get_the_post_thumbnail($post->ID, $image_size);
		}

		function get_slider_thumb( $title ){
			global $post;
			// If functionality or image doesn't exist, go ahead and terminate
			if( ! function_exists('has_post_thumbnail') || ! has_post_thumbnail($post->ID) ) return false;
			// Filter allows for use of particular thumbnail size in the slider
			$thumb_size = apply_filters('promoslider_thumb_size', 'thumbnail');
			// Return the appropriate sized image with corrected title attribute
			return preg_replace('/title="[^"]*"/', 'title="'.$title.'"', get_the_post_thumbnail($post->ID, $thumb_size) );
		}

		function fetch_link_settings(){
			global $post;
			// If the destination url is set by the user, use that.  Otherwise, use the permalink
			$destination_url = get_post_meta($post->ID, '_promo_slider_url', true);
			if( ! $destination_url )
				$destination_url = get_permalink($post->ID);
			// If the target attribute is set by the user, use that.  Otherwise, set it to _self
			$target = get_post_meta($post->ID, '_promo_slider_target', true);
			if( ! $target ) $target = '_self';
			// Setup the disable links variable
			$disable_links = get_post_meta($post->ID, '_promo_slider_disable_links', true);
			return compact('destination_url', 'target', 'disable_links');
		}

		function add_promotion_columns( $columns ){
			// Create a new array so we can put columns in the order we want
			$new_columns = array();
			// Transfer columns to new array and append ours after the desired elements
			foreach($columns as $key => $value){
				$new_columns[$key] = $value;
				if($key == 'title'){
					$new_columns['images'] = __('Images', 'promotion-slider');
					$new_columns[$this->taxonomy] = __('Sliders', 'promotion-slider');
				}
			}
			// Return the new column configuration
			return $new_columns;
		}

		function show_promotion_columns( $name ) {
			global $post;
			// Display our categories on the promotions listing page
			switch ( $name ) {
				case $this->taxonomy:
					$terms = get_the_terms( $post->ID, $this->taxonomy );
					if( $terms ){
						$links = array();
						foreach( $terms as $term ){
							$links[] = '<a href="edit.php?post_type='.$this->post_type.'&'.$this->taxonomy.'='.$term->slug.'">'.$term->name.'</a>';
						}
						echo implode(', ', $links);
					}
					else
						_e('No sliders', 'promotion-slider');
					break;
				case 'images':
					if( ! function_exists('has_post_thumbnail') || ! has_post_thumbnail($post->ID) )
						_e('Featured image not set', 'promotion-slider');
					else
						echo get_the_post_thumbnail($post->ID, 'thumbnail');
					break;
			}
		}

		function manage_posts_by_category(){
			global $typenow;
			// If we are on our custom post type screen, add our custom taxonomy as a filter
			if( $typenow == $this->post_type ){
				$taxonomy = get_terms($this->taxonomy);
				if( $taxonomy ): //print_r($taxonomy); ?>
					<select name="<?php echo $this->taxonomy; ?>" id="<?php echo $this->taxonomy; ?>" class="postform">
						<option value="">Show All Categories</option><?php
						foreach( $taxonomy as $terms ): ?>
							<option value="<?php echo $terms->slug; ?>"<?php if( isset($_GET[$this->taxonomy]) && $terms->slug == $_GET[$this->taxonomy] ) echo ' selected="selected"'; ?>><?php echo $terms->name; ?></option><?php
						endforeach; ?>
					</select><?php
				endif;
			}
		}

		function get_options(){
			// Get options from database
			$options = get_option('promotion_slider_options');
			// If nothing, return false
			if( !$options ) return false;
			// Otherwise, return the options as an object (my personal preference)
			return (object) $options;
		}

		function update_options( $options = array() ){
			// Get plugin default options as an array
			$defaults = (array) $this->options;
			// Get new options as an array
			$options = (array) $options;
			// Merge the arrays allowing the new options to override defaults
			$options = wp_parse_args( $options, $defaults );
			// Validate options
			foreach( $options as $option => $value ){
				$options[$option] = $this->validate_options( $option, $value );
				if( $value === false ) unset($options[$option]);
			}
			// Return new options array
			return $options;
		}

		function validate_options( $option_name, $option_value ){
			switch( $option_name ){
				case 'post_type':
					if( $option_value != $this->post_type && post_type_exists($option_value) )
						return $option_value;
					return $this->post_type;
					break;
				case 'category':
					if( term_exists($option_value) )
						return $option_value;
					return false;
				case 'slider':
					if( term_exists( $option_value ) )
						return $option_value;
					return false;
					break;
				case 'id':
					return $option_value;
					break;
				case 'width':
					return $option_value;
					break;
				case 'height':
					return $option_value;
					break;
				case 'numberposts':
					$option_value = (int) $option_value;
					if( is_int($option_value) )
						return $option_value;
					return -1;
					break;
				case 'default_img_size':
					if( in_array($option_value, array('thumbnail', 'medium', 'large', 'full')) )
						return $option_value;
					break;
				default:
					return Promotion_Slider_Options::validate_option( $option_name, $option_value );
			}
			return $this->options[$option_name];
		}

		function save_options( $options ){
			// Takes an array or object and saves the options to the database after validating
			update_option('promotion_slider_options', $this->update_options($options));
		}

		function option_management(){
			// Get existing options array, if available
			$options = (array) $this->get_options();
			// If unavailable, create an empty array
			if( !$options ) $options = array();
			// Original options were stored individually, transfer these to our array
			if( get_option('time_delay') ) $options['time_delay'] = get_option('time_delay');
			if( get_option('auto_advance') ) $options['auto_advance'] = get_option('auto_advance');
			if( get_option('show_title') ) $options['show_title'] = get_option('show_title');
			if( get_option('show_excerpt') ) $options['show_excerpt'] = get_option('show_excerpt');
			if( get_option('nav_option') ) $options['nav_option'] = get_option('nav_option');
			if( get_option('disable_fancy_title') ) $options['disable_fancy_title'] = get_option('disable_fancy_title');
			if( get_option('disable_fancy_nav') ) $options['disable_fancy_nav'] = get_option('disable_fancy_nav');
			// Update auto_advance option due to change in values
			if( isset( $options['auto_advance'] ) ) {
				if( true == $options['auto_advance'] ) $options['auto_advance'] = 'auto_advance';
				elseif( false == $options['auto_advance'] ) $options['auto_advance'] = 'no_auto_advance';
				else $options['auto_advance'] = 'auto_advance';
			}
			// Update depreciated options
			if( isset($options['nav_option']) ) $options['display_nav'] = $options['nav_option'];
			if( isset($options['disable_fancy_nav']) && $options['disable_fancy_nav'] != true ) $options['nav_option'] = 'fancy';
			if( isset($options['show_title']) && $options['show_title'] != true ) $options['display_title'] = 'none';
			elseif( isset($options['disable_fancy_title']) && $options['disable_fancy_title'] == true ) $options['display_title'] = 'default';
			elseif( isset($options['disable_fancy_title']) && $options['disable_fancy_title'] == false ) $options['display_title'] = 'fancy';
			if( isset( $options['show_excerpt'] ) && $options['show_excerpt'] == true ) $options['display_excerpt'] = 'excerpt';
			else $options['display_excerpt'] = 'none';
			// Properly saves options and updates plugin version
			$this->save_options( $options );
			// Remove legacy options, if needed
			ps_legacy::remove_legacy_options();
		}

	}

	new promo_slider();

}